package main

import (
	"encoding/json"
	"fmt"
	"io/ioutil"
	"net/http"
)

// 配合服务端程序，将另外书写一个 post-client 、 一个 get-client

// 客户端的请求信息封装在 http.Request 对象中
// 服务端的返回响应报文保存在 http.Response 结构体中
// 发送给客户端的响应并不是 http.Response ， 而是通过 http.ResponseWriter 接口来实现的。以下是其一些方法的描述
// Header()  用户设置或获取响应头信息
// Write()  用于写入数据到响应体
// WriteHeader() 用于设置响应状态码，若不调用默认为 200 OK

// post 的handler
// http.ResponseWriter 控制响应信息；http.Request 获取请求信息
// 使用下方 handlefunc 需要保持格式：  handler  func(ResponseWriter, *Request)
func dealPostReqhandler(w http.ResponseWriter, r *http.Request) {
	// 获取请求体信息
	data, _ := ioutil.ReadAll(r.Body)

	// 反序列化 转变数据结构 json--结构体

	var param = new(struct {
		Name string `json:"name"`
	})
	json.Unmarshal(data, &param)

	//	业务处理逻辑

	fmt.Println("dealpost接收到参数：", param)

	//	响应内容
	w.WriteHeader(http.StatusOK) // header 默认值
	//第一种响应方式
	//w.Write([]byte(fmt.Sprintf("接收到的名字是%s", param.Name)))
	// 第二种响应方式
	json.NewEncoder(w).Encode(fmt.Sprintf("dealpost 的响应值是%s", param.Name))
}

// get 的 handler
func dealgetReqhandler(w http.ResponseWriter, r *http.Request) {
	query := r.URL.Query()
	name2 := query.Get("name")

	fmt.Println("dealget通过get 方法获取到：", name2)

	w.Write([]byte(fmt.Sprintf("dealgethandler 的响应值是 %s", name2)))
}

func main() {
	// 为了 post 和 get；定义两个接口，以及其对应的处理方法

	// 传参：接口路径、handler--接口所对应的处理方法、
	http.HandleFunc("/req/post", dealPostReqhandler)
	http.HandleFunc("/req/get", dealgetReqhandler)

	//	 需要启动 server 端
	http.ListenAndServe(":8005", nil)
}
